#!/usr/bin/python
#coding=utf-8
'''
    # 4.3. Creating New Iteration Patterns with Generators
    实现一个自定义迭代模式，
    跟普通的内置函数range()、reversed()不一样
'''

# 生产某个范围内浮点数的生成器
# （实现一种新的迭代模式，使用一个生成器函数来定义它）
def frange(start, stop, increment):
    x = start
    while x < stop:
        yield x
        x += increment

# 使用for循环/其他接受一个可迭代对象的函数（如sum()、list()等。）
for n in frange(0, 4, 0.5):
    print(n)

a = list(frange(0, 1, 0.125))
print(a)

##** 一个yield语句即可将其转换为一个生成器
# 跟普通函数不同的是，生成器只能用于迭代操作。

# 展示这样的函数底层工作机制
def countdown(n):
    print('Starting to count from', n)
    while n > 0:
        yield n
        n -= 1
    print('Done!')

c = countdown(3)
print(c)

# Run to first yield and emit a value
d1 = next(c)
print(d1)

# Run to the next yield
d2 = next(c)
print(d2)

# Run to the next yield
d3 = next(c)
print(d3)

# Run to next yield (iteration stops)
d4 = next(c)
print(d4)

# 总结：
# 一个生成器函数 主要特征是它只会回应在迭代中使用到的next操作。
# 一旦生成器函数返回退出，迭代终止。
# 我们在迭代中通常使用的for语句会自动处理这些细节，所以我们无需担心。
